home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2000 #4 / Amiga Plus CD - 2000 - No. 4.iso / Tools / Musik / Misc / Amster / Source / msg.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-05-27  |  6.0 KB  |  219 lines

  1. /*
  2. ** Message
  3. */
  4.  
  5. #include "include/config.h"
  6.  
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <string.h>
  10.  
  11. #include "include/mui.h"
  12. #include <proto/utility.h>
  13. #include <MUI/NListview_mcc.h>
  14.  
  15. #include "include/gui.h"
  16. #include "include/napster.h"
  17. #include "include/msg.h"
  18. #include "amster_Cat.h"
  19. #include "include/protos.h"
  20.  
  21. ULONG msg_new(struct IClass *cl, Object *obj, struct opSet *msg);
  22. void msg_say(struct msgdata *data);
  23. void msg_whois(struct msgdata *data, char *info);
  24. void msg_whowas(struct msgdata *data, char *user, char *level, u_long lastseen);
  25. char *msg_make(int d, char *nick, char *msg);
  26.  
  27.  
  28. MUIF msg_dispatch(REG(a0) struct IClass *cl,REG(a2) Object *obj,REG(a1) Msg msg)
  29. {
  30.     struct msgdata *data = INST_DATA(cl,obj);
  31.  
  32.     switch(msg->MethodID) {
  33.         case OM_NEW: return(msg_new(cl,obj,(APTR)msg));
  34.         case MSG_OPEN:
  35.             set(obj,MUIA_Window_Open,TRUE);
  36.             return(NULL);
  37.         case MSG_GOT:
  38.             {
  39.             struct msgdata *data = INST_DATA(cl,obj);
  40.             long winopen;
  41.  
  42.             get(obj, MUIA_Window_Open, &winopen);
  43.             if (!winopen) set(obj, MUIA_Window_Open, TRUE);
  44.  
  45.             DoMethod(data->msglist,MUIM_NList_InsertSingle,(char*)((muimsg)msg)->arg1,MUIV_NList_Insert_Bottom);
  46.             set(data->msglist,MUIA_NList_First,MUIV_NList_Active_Bottom);
  47.             return(NULL);
  48.             }
  49.         case MSG_SAY:
  50.             msg_say(data);
  51.             return(NULL);
  52.         case MSG_WHOIS:
  53.             msg_whois(data, (char *)(((muimsg)msg)->arg1));
  54.             return(NULL);
  55.         case MSG_WHOWAS:
  56.             msg_whowas(data, (char *)(((muimsg)msg)->arg1), (char *)(((muimsg)msg)->arg2), (u_long)(((muimsg)msg)->arg3));
  57.             return(NULL);
  58.  
  59.     }
  60.     return(DoSuperMethodA(cl,obj,msg));
  61. }
  62.  
  63.  
  64. ULONG msg_new(struct IClass *cl, Object *obj, struct opSet *msg)
  65. {
  66.     struct msgdata *data;
  67.     Object *msglist,*msgstr;
  68.  
  69.     if (obj = (Object *)DoSuperNew(cl, obj,
  70.         MUIA_HelpNode, "messenger",
  71.         WindowContents, VGroup,
  72.             Child, NListviewObject,
  73.                 MUIA_NListview_NList, msglist = NListObject,
  74.                     ReadListFrame,
  75.                     MUIA_NList_Input, FALSE,
  76.                     MUIA_NList_DefaultObjectOnClick, FALSE,
  77.                     MUIA_NList_ConstructHook, MUIV_NList_ConstructHook_String,
  78.                     MUIA_NList_DestructHook, MUIV_NList_DestructHook_String,
  79.                     MUIA_NList_Format, "",
  80.                     MUIA_NList_AutoCopyToClip, TRUE,
  81.                     MUIA_NList_TypeSelect, MUIV_NList_TypeSelect_Char,
  82.                     MUIA_NList_AutoVisible, TRUE,
  83.                 End,
  84.             End,
  85.             Child, msgstr = StringObject,
  86.                 StringFrame,
  87.                 MUIA_CycleChain, 1,
  88.                 MUIA_String_MaxLen, 256,
  89.             End,
  90.         End,
  91.         TAG_MORE, msg->ops_AttrList))
  92.     {
  93.         data = INST_DATA(cl,obj);
  94.         data->msglist = msglist;
  95.         data->msgstr = msgstr;
  96.  
  97.         set(obj,MUIA_Window_ID,MAKE_ID('M','E','S','G'));
  98.         set(obj,MUIA_Window_Title,MSG_USER_TITLE),
  99.  
  100.         DoMethod(msgstr,MUIM_Notify,MUIA_String_Acknowledge,MUIV_EveryTime,obj,1,MSG_SAY);
  101.         DoMethod(msgstr,MUIM_Notify,MUIA_String_Acknowledge,MUIV_EveryTime,obj,3,MUIM_Set,MUIA_Window_ActiveObject,msgstr);
  102.         DoMethod(msgstr,MUIM_Notify,MUIA_String_Acknowledge,MUIV_EveryTime,msgstr,3,MUIM_Set,MUIA_String_Contents,NULL);
  103.         DoMethod(obj,MUIM_Notify,MUIA_Window_Activate,TRUE,obj,3,MUIM_Set,MUIA_Window_ActiveObject,msgstr);
  104.         DoMethod(obj,MUIM_Notify,MUIA_Window_CloseRequest,TRUE,obj,3,MUIM_Set,MUIA_Window_Open,FALSE);
  105.  
  106.         return((ULONG)obj);
  107.     }
  108.     return(0);
  109. }
  110.  
  111.  
  112. void msg_say(struct msgdata *data)
  113. {
  114.     u_long tmp;
  115.     char *cmd,*args;
  116.  
  117.     if(!gui_napon) {
  118.         DoMethod(data->msglist,MUIM_NList_InsertSingle,msg_make(2,NULL,(char *)MSG_USER_NOTCONN),MUIV_NList_Insert_Bottom);
  119.         set(data->msglist,MUIA_NList_First,MUIV_NList_Active_Bottom);
  120.         return;
  121.     }
  122.     GetAttr(MUIA_String_Acknowledge,data->msgstr,&tmp);
  123.     cmd = strtok((char*)tmp," ");
  124.     args = strtok(NULL,"");
  125.     if(!cmd) return;
  126.  
  127.     if(stricmp(cmd,"/whois")==0)
  128.         nap_sendbuf(NAPC_WHOIS,args);
  129.     else {
  130.         sprintf(nap_buf,"%s %s",cmd,args);
  131.         nap_send(NAPC_PRIVATEMSG);
  132.         DoMethod(data->msglist,MUIM_NList_InsertSingle,msg_make(1,cmd,args),MUIV_NList_Insert_Bottom);
  133.         set(data->msglist,MUIA_NList_First,MUIV_NList_Active_Bottom);
  134.     }
  135. }
  136.  
  137.  
  138. void msg_whois(struct msgdata *data, char *info)
  139. {
  140.     char buf[1024];
  141.     char *nick, *level, *channels, *status, *client;
  142.     int time, shared, downloads, uploads, link;
  143.  
  144.     nick =      nap_token(&info);
  145.     level =     nap_token(&info);
  146.     time =      nap_ltoken(&info);
  147.     channels =  nap_token(&info);
  148.     status =    nap_token(&info);
  149.     shared =    nap_itoken(&info);
  150.     downloads = nap_itoken(&info);
  151.     uploads =   nap_itoken(&info);
  152.     link =      nap_itoken(&info);
  153.     client =    nap_token(&info);
  154.     sprintf(buf, "\33bUser: %s (level: %s) - online: %d:%02d:%02d (%s)",
  155.         nick, level, time/360, (time/60)%60, time%60, status);
  156.     DoMethod(data->msglist, MUIM_NList_InsertSingle, buf, MUIV_NList_Insert_Bottom);
  157.  
  158.     if (channels != NULL) {
  159.         sprintf(buf, "\33bChannels: %s", channels);
  160.         DoMethod(data->msglist, MUIM_NList_InsertSingle, buf, MUIV_NList_Insert_Bottom);
  161.     }
  162.     sprintf(buf, "\33bShares: %d, downloads: %d, uploads: %d",
  163.         shared, downloads, uploads);
  164.     DoMethod(data->msglist, MUIM_NList_InsertSingle, buf, MUIV_NList_Insert_Bottom);
  165.  
  166.     sprintf(buf, "\33bClient: %s, link: %s", client, nap_linktype[link]);
  167.     DoMethod(data->msglist, MUIM_NList_InsertSingle, buf, MUIV_NList_Insert_Bottom);
  168.  
  169.     set(data->msglist, MUIA_NList_First, MUIV_NList_Active_Bottom);
  170. }
  171.  
  172.  
  173. void msg_whowas(struct msgdata *data, char *user, char *level, u_long lastseen)
  174. {
  175.     struct ClockData *cd;
  176.     char buf[1024];
  177.  
  178.     lastseen -= (8*365+2)*24*60*60;
  179.     /* Number of seconds between January 1st/0:00, 1970 and January 1st/0:00, 1978 */
  180.  
  181.     if (cd = malloc(sizeof(struct ClockData))) {
  182.         Amiga2Date(lastseen, cd);
  183.         sprintf(buf, "\33bUser: %s (level: %s) - last seen: %02d/%02d/%d %02d:%02d:%02d", user, level, cd->month, cd->mday, cd->year, cd->hour, cd->min, cd->sec);
  184.         free(cd);
  185.         DoMethod(data->msglist, MUIM_NList_InsertSingle, buf, MUIV_NList_Insert_Bottom);
  186.     }
  187.     else gui_debug("Out of memory: msg_whowas()");
  188. }
  189.  
  190.  
  191. void msg_got(char *nick, char *msg)
  192. {
  193.     char *tmp;
  194.  
  195.     tmp = msg_make(0,nick,msg);
  196.     if(tmp) DoMethod(gui->mwin,MSG_GOT,tmp);
  197. }
  198.  
  199.  
  200. void msg_gotwhois(char *buf)
  201. {
  202.     DoMethod(gui->mwin, MSG_WHOIS, buf);
  203. }
  204.  
  205.  
  206. char *msg_make(int d, char *nick, char *msg)
  207. {
  208.     static char buf[1024];
  209.  
  210.     if(d==0)
  211.         sprintf(buf,"<%s> \33b%s",nick,msg);
  212.     else if(d==1)
  213.         sprintf(buf,"<%s> \33i%s",nick,msg);
  214.     else if(d==2)
  215.         sprintf(buf,"* %s",msg);
  216.  
  217.     return(buf);
  218. }
  219.